/* eslint-disable */
// 正则集合

// 正则类型集合
export enum RegName {
  EMAIL = "EMAIL", // 邮箱
  TEL = "TEL", // 手机号码
  IP = "IP", // ip
  PWD = "PWD", // 密码
  NAME = "NAME", // 名称
  PORT = "PORT", // 端口
  TITLE = "TITLE", // 端口
  NAMESHORT = "NAMESHORT", // 短名称
  PORTNEW = "PORTNEW", // 严格版本端口
  HOST = "HOST", //HOST
  NAME_NEW = "NAME_NEW", //新规则的名称
  CODE = "CODE", //标识
}
interface TPattern {
  [RegName.EMAIL]: RegExp; // 邮箱校验规则
  [RegName.TEL]: RegExp; // 手机号码校验规则
  [RegName.IP]: RegExp; // ip校验规则
  [RegName.PWD]: RegExp; // 密码校验规则
  [RegName.NAME]: RegExp; // 用户名校验规则
  [RegName.PORT]: RegExp; // 端口校验规则
  [RegName.TITLE]: RegExp; // 新版用户名称校验提示
  [RegName.NAMESHORT]: RegExp; // 短名称校验提示
  [RegName.PORTNEW]: RegExp; // 严格版本端口校验提示
  [RegName.HOST]: RegExp; //访问地址
  [RegName.NAME_NEW]: RegExp; //别名
  [RegName.CODE]: RegExp; // 新规则的名称
}
interface TPatternMsg {
  [RegName.EMAIL]: string; // 邮箱校验提示
  [RegName.TEL]: string; // 手机号码校验提示
  [RegName.IP]: string; // ip校验提示
  [RegName.PWD]: string; // 密码校验提示
  [RegName.NAME]: string; // 用户名校验提示
  [RegName.PORT]: string; // 端口校验提示
  [RegName.TITLE]: string; // 新版用户名称校验提示
  [RegName.NAMESHORT]: string; // 短名称校验提示
  [RegName.PORTNEW]: string; // 严格版本端口校验提示
  [RegName.HOST]: string; // 访问地址
  [RegName.NAME_NEW]: string; //别名
  [RegName.CODE]: string; // 新规则的名称
}

// 正则表达式
const patterns: TPattern = {
  [RegName.EMAIL]: /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
  [RegName.TEL]: /^1[3|4|5|7|8]\d{9}$/,
  [RegName.IP]:
    /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/,
  // [RegName.PWD]: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$/,
  // [RegName.PWD]: /^[a-zA-Z0-9!@#$%^&*~,.?_-]{5,}$/,
  [RegName.PWD]:
    /^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()=+~;:'",\\\[\]<.>{ }|/?_-])[a-zA-Z0-9!@#$%^&*()=+~;:'",\\\[\]<.>{ }|/?_-]{8,64}$/,
  [RegName.NAME]: /^[a-zA-Z0-9_]{2,20}$/,
  [RegName.TITLE]: /^[a-zA-Z0-9\u4e00-\u9fa5_-]{1,20}$/u,
  [RegName.PORT]: /\d{4}$/,
  [RegName.PORTNEW]: /^([1-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-5]{2}[0-3][0-5])$/,
  [RegName.NAMESHORT]: /^[A-Za-z0-9_]{1,50}$/,
  [RegName.HOST]:
    /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/,
  [RegName.CODE]: /^[a-z0-9]([a-z0-9-]{0,32}[a-z0-9])?$/u,
  [RegName.NAME_NEW]: /^(?!-)[\u4e00-\u9fa5a-zA-Z0-9-]{0,32}(?<!-)$/u, // 别名
};

// 正则表达式的提示信息
const patternMsg: TPatternMsg = {
  [RegName.EMAIL]: "非正确邮箱格式",
  [RegName.TEL]: "手机号码格式错误",
  [RegName.IP]: "ip格式错误",
  // [RegName.PWD]: "密码必须包含大小写字母和数字的组合，可以使用特殊字符，长度在8-10之间",
  // [RegName.PWD]: '密码最小5位，允许数字、字母、特殊字符，特殊字符包括!@#$%^&*~,.?_-',
  [RegName.PWD]:
    "密码必须包含至少一个数字、一个小写字母、一个大写字母和一个特殊字符（~!@#$%^&*()-_=+\\|[{}];:'\",<.>/? 或空格），长度为 8 到 64 个字符",
  [RegName.NAME]: "可以使用英文、数字和下划线, 长度在2-20之间",
  [RegName.PORT]: "非正确端口格式",
  [RegName.PORTNEW]: "非正确端口格式",
  [RegName.TITLE]: "由中文,英文,数字, -, _ 字符组成，不超过20个字符",
  [RegName.NAMESHORT]: "只能包含_,数字和英文，不超过50个字符",
  [RegName.HOST]: "地址格式错误",
  [RegName.NAME_NEW]: "格式错误",
  [RegName.CODE]: "格式错误",
};

/**
 * @internal 仅限内部使用
 * @param name 正则类型名称
 * @param para 默认'g', 表示全局匹配
 * @return 根据name返回所匹配的正则pattern和提示信息message
 */
const pattern = (name: RegName, para = "g") => {
  return {
    pattern: new RegExp(patterns[name], para),
    message: patternMsg[name],
  };
};

export default pattern;
